/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package szachy;

import java.io.Serializable;
import java.rmi.Remote;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;

//główna klasa obsługująca grę
//główna klasa obsługująca grę
/**
 *
 * @author Robert
 */
interface IGra extends Remote {

    public int ZwrocKolor(int x, int y) throws RemoteException;

    public Pole[][] ZwrocPlansze() throws RemoteException;

    public void WyczyscPlansze() throws RemoteException;

    public void RozstawFigury() throws RemoteException;

    public boolean WykonajRuchu(int poczX, int poczY, int docX, int docY, Krol k) throws RemoteException;

    public void UstalFigure(Figura f, int x, int y) throws RemoteException;

    public boolean CzyZajete(int x, int y) throws RemoteException;

    public Figura ZwrocFigure(int x, int y) throws RemoteException;

    public void UstalZajetosc(int x, int y, boolean zajete) throws RemoteException;

    public boolean PrzydzielNumer() throws RemoteException;

    public boolean CzyjRuch() throws RemoteException;
     public boolean SprawdzMat() throws RemoteException;
}

//główna klasa obsługująca grę
public class Gra extends UnicastRemoteObject implements IGra, Serializable {

    private static final long serialVersionUID = 1L;

    public Gra() throws RemoteException {
        plansza = new Pole[8][8];
        boolean jasny = true;
        for (int i = 0; i < 8; i++) {
            for (int j = 0; j < 8; j++) {
                plansza[i][j] = new Pole();
                //plansza[i][j].UstalFigure(new Figura());
                if (jasny) {
                    plansza[i][j].UstalKolor('j');
                    jasny = !jasny;
                } else {
                    plansza[i][j].UstalKolor('c');
                    jasny = !jasny;
                }
            }
            jasny = !jasny;
        }
        aktualnyGracz = 1;
        mat=false;
        szach=false;
    }

    public int ZwrocKolor(int x, int y) {
        return plansza[x][y].PobierzKolor();
    }

    public boolean CzyjRuch() {
        return nr;
    }

    public Pole[][] ZwrocPlansze() {
        return plansza;
    }

    public Figura ZwrocFigure(int x, int y) {
        return plansza[x][y].PobierzFigure();
    }

    public void WyczyscPlansze() {
        for (int i = 0; i < 8; i++) {
            for (int j = 0; j < 8; j++) {
                plansza[i][j].UsunFigure();
            }
        }
    }

    public boolean CzyZajete(int x, int y) {
        return plansza[x][y].SprawdzCzyPoleZajete();
    }

    public boolean PrzydzielNumer() {
        nr = !nr;
        return nr;
    }

    public void RozstawFigury() {
        WyczyscPlansze();
        //czarne
        for (int i = 0; i < 8; i++) {
            UstalFigure(new Pion('c', "black_pawn", "pion"), 1, i);
        }
        UstalFigure(new Wieza('c', "black_rook", "wieza"), 0, 0);
        UstalFigure(new Wieza('c', "black_rook", "wieza"), 0, 7);
        UstalFigure(new Skoczek('c', "black_knight", "skoczek"), 0, 1);
        UstalFigure(new Skoczek('c', "black_knight", "skoczek"), 0, 6);
        UstalFigure(new Goniec('c', "black_bishop", "goniec"), 0, 2);
        UstalFigure(new Goniec('c', "black_bishop", "goniec"), 0, 5);
        UstalFigure(new Hetman('c', "black_queen", "hetman"), 0, 3);
        UstalFigure(new Krol('c', "black_king", "krol"), 0, 4);
        //białe
        for (int i = 0; i < 8; i++) {
            UstalFigure(new Pion('j', "white_pawn", "pion"), 6, i);
        }
        UstalFigure(new Wieza('j', "white_rook", "wieza"), 7, 0);
        UstalFigure(new Wieza('j', "white_rook", "wieza"), 7, 7);
        UstalFigure(new Skoczek('j', "white_knight", "skoczek"), 7, 1);
        UstalFigure(new Skoczek('j', "white_knight", "skoczek"), 7, 6);
        UstalFigure(new Goniec('j', "white_bishop", "goniec"), 7, 2);
        UstalFigure(new Goniec('j', "white_bishop", "goniec"), 7, 5);
        UstalFigure(new Hetman('j', "white_queen", "hetman"), 7, 3);
        UstalFigure(new Krol('j', "white_king", "krol"), 7, 4);
    }

    public boolean WykonajRuchu(int poczX, int poczY, int docX, int docY, Krol K) throws RemoteException {
        if (plansza[poczX][poczY].PobierzFigure().mozliwyRuch(poczX, poczY, docX, docY, this) || plansza[poczX][poczY].PobierzFigure().mozliwoscBicia(poczX, poczY, docX, docY, this)) {
            boolean zaj=plansza[docX][docY].SprawdzCzyPoleZajete();
            Figura tmp=plansza[docX][docY].PobierzFigure();
            plansza[docX][docY].UstalFigure(plansza[poczX][poczY].PobierzFigure());
            plansza[poczX][poczY].UsunFigure();
            if(szach){
                if(K.czySzach(this)){
                    plansza[poczX][poczX].UstalFigure(plansza[docX][docY].PobierzFigure());
                    plansza[docX][docY].UsunFigure();
                    if(zaj)
                        plansza[docX][docY].UstalFigure(tmp);
                    nr=!nr;
                }
                else szach=false;
            }
            nr = !nr; //zamiana gracza
            return true;
        }
        if (K.czySzach(this)) {
            szach = true;
            System.out.println("Jest szach");
            if(K.sprawdzMat()){
                mat=true;
                System.out.println("Jest mat");
            }
        } else {
            szach = false;
        }
        //jeśli nie można wykonać ruchu
        return false;
    }
    public boolean SprawdzMat(){
        return mat;
    }
    public void UstalFigure(Figura f, int x, int y) {
        plansza[x][y].UstalFigure(f);
    }

    public void UstalZajetosc(int x, int y, boolean zajete) {
        plansza[x][y].UstalZajetosc(zajete);
    }
    Pole[][] plansza;
    char aktualnyGracz;
    static boolean nr = false;
    boolean szach;
    boolean mat;
}
